#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int tot,first[N],nnext[N<<1],to[N<<1],dp[N][2];
vector<int>v[N];
bitset<N>vis[N][2];
void add(int x,int y){
	nnext[++tot]=first[x];
	first[x]=tot;
	to[tot]=y;
}
void dfs(int u,int fa){
	v[u].push_back(u);
	for(int e=first[u];e;e=nnext[e]){
		if(to[e]!=fa){
			dfs(to[e],u);
			if(v[u].size()<v[to[e]].size()){
				swap(v[u],v[to[e]]);
			}
			for(auto i:v[to[e]]){
				v[u].push_back(i);
			}
			v[to[e]].clear();
			v[to[e]].shrink_to_fit();
		}
	}
	dp[u][1]=dp[u][0]=1;
	vis[u][1][u]=vis[u][0][u]=1;
	for(auto i:v[u]){
		for(auto j:v[u]){
			if(j==u){
				continue;
			}
			if(i==u){
				if(dp[j][0]+1>dp[u][1]){
					dp[u][1]=dp[j][0]+1;
					vis[u][1]=vis[j][0];
					vis[u][1][u]=1;
				}
				continue;
			}
			if((vis[i][0]&vis[j][0]).count()==0){
				if(dp[i][0]+dp[j][0]+1>dp[u][0]){
					dp[u][0]=dp[i][0]+dp[j][0]+1;
					vis[u][0]=vis[i][0]|vis[j][0];
					vis[u][1][u]=1;
				}
				if(dp[i][0]+dp[j][0]+1>dp[u][1]){
					dp[u][1]=dp[i][0]+dp[j][0]+1;
					vis[u][1]=vis[i][0]|vis[j][0];
					vis[u][1][u]=1;
				}
			}
			if((vis[i][0]&vis[j][1]).count()==0){
				if(dp[i][0]+dp[j][1]+1>dp[u][1]){
					dp[u][1]=dp[i][0]+dp[j][1]+1;
					vis[u][1]=vis[i][0]|vis[j][1];
					vis[u][1][u]=1;
				}
			}
		}
	}
}
int main(){
	freopen("bird.in","r",stdin);
	freopen("bird.out","w",stdout);
	int n,a,b;
	scanf("%d",&n);
	for(int i=1;i<=n-1;i++){
		scanf("%d%d",&a,&b);
		add(a,b);
		add(b,a);
	}
	dfs(1,0);
	printf("%d",dp[1][1]);
}